iT邦幫忙

1

[猩猩也會用] 學會Gunicorn 只需要看這篇

  • 分享至 

  • xImage
  •  

Gunicorn

全名 Green Unicorn,是一個基於Python的WSGI HTTP伺服器,被設計用於運行 Python 網站為,為Flask等框架提供了可靠的支援。Gunicorn 是一個簡單、高效且與多數 Python 網框架兼容的 WSGI 伺服器,適合部署在生產環境中。

Gunicorn 的特點
與其他 WSGI 伺服器的比較
與 uWSGI、mod_wsgi 等其他 WSGI 伺服器相比,Gunicorn 更加輕量且配置簡單。

Gunicorn 的優勢

  • 高性能:能夠處理大量請求,性能表現優異。
  • 易於配置:提供簡單直觀的配置方式。
  • 支援多種工作模式:支持同步與異步工作模式。
  • 擴展性好:支持多工作進程模式,能夠充分利用多核 CPU 資源。

安裝 Gunicorn
環境需求 : Gunicorn 支持 Python 2.7、3.4 及以上版本。
可以直接使用 pip 安裝 pip install gunicorn

基本使用

啟動基本命令,指定應用程序,假設應用程式在 myapp.py 中,並包含 WSGI 應用 app。
gunicorn myapp:app

Port --bind or -b
gunicorn -b 0.0.0.0:8000 myapp:app

工作進程數量 --workers or -w
gunicorn -w 3 myapp:app

進階設定

配置文件
可以將配置選項寫入文件中,例如 gunicorn.conf.py,並使用 -c or --config 參數加載:
以下列出常用的設定,詳細可以參考官網 document

  1. 編輯 gunicorn.conf.py 進行設定
# 是否開啟除錯模式,當程式碼有變動,會自動重啟
debug = True
# 訪問地址
bind = "0.0.0.0:6000"
# 工作進程數
workers = 2
# 工作線程數
threads = 2
# 超時時間
timeout = 600
# 輸出日誌級別
loglevel = 'debug'
# 存放日誌路徑
pidfile = "log/gunicorn.pid"
# 存放訪問日誌路徑
accesslog = "log/access.log"
# 存放錯誤日誌路徑
errorlog = "log/debug.log"
# gunicorn + apscheduler 場景下,解決多 worker 運行定時任務重複執行的問題
preload_app = True
  1. 執行 gunicorn -c gunicorn.conf.py myapp:app

工作模式
gunicorn 有分成幾種工作模式,可以依據需求挑選不同工作模式
命令行-k STRING或者--worker-class STRING
一共有五種工作模式,sync、eventlet、gevent、tornado、gthread
默認的工作模式是sync。
詳細語法內容可以參考 官網document
每個應用模式情景可以參考 官網document-Design

工作模式類別指令如下:
gunicorn --worker-class sync myapp:app
描述:同步工作進程,每次處理一個請求。
適用場景:適合大多數常規工作負載。

gunicorn --worker-class eventlet myapp:app
描述:基於 Eventlet 的異步工作進程。
適用場景:需要 Eventlet >= 0.24.1,用於高併發的應用。

gunicorn --worker-class gevent myapp:app
描述:基於 Gevent 的異步工作進程。
適用場景:需要 Gevent >= 1.4,用於高併發的應用。

gunicorn --worker-class tornado myapp:app
描述:基於 Tornado 的工作進程。
適用場景:需要 Tornado >= 0.2,適合使用 Tornado 開發的應用。

gunicorn --worker-class gthread myapp:app
描述:基於線程的工作進程。
適用場景:適合需要同時處理多個請求的場景,Python 2 需要 futures package。

大致可以簡單分為以下種類,以滿足不同應用場景的需求:
Sync Workers
描述:同步工作進程,每次處理一個請求。
特點:簡單易用,但不支持持久連接。適合簡單的、低併發的應用。

Async Workers
描述:異步工作進程,基於 Greenlets (Eventlet 和 Gevent) 實現。
特點:適合高併發場景,可以處理長時間的請求如外部 API 調用或流式請求。

Gthread Workers
描述:基於線程的工作進程,接受連接後將其添加到線程池中處理。
特點:適合需要同時處理多個請求的場景,能有效利用多核 CPU。

Tornado Workers
描述:基於 Tornado 框架的工作進程。
特點:適合使用 Tornado 開發的應用,但不推薦用於 WSGI 應用。

AsyncIO Workers
描述:基於 Python 3 的 AsyncIO 實現。
特點:適合需要使用 aiohttp 的應用,能充分利用 AsyncIO 的優勢。

性能調適
工作進程的數量設定
一般建議設定為 (2 x 核心數量) + 1。過多的工作進程會導致系統資源過度消耗,降低整體吞吐量。
gunicorn --workers=4 myapp:app
超時設置
適當的超時設置可以避免工作進程長時間處於無響應狀態,提升伺服器穩定性。
gunicorn --timeout=30 myapp:app

實戰案例

一個簡單的 Flask 應用部署示例
假設應用程式在 app.py 中:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"

啟動 Gunicorn:
gunicorn app:app --bind 0.0.0.0:5005

https://ithelp.ithome.com.tw/upload/images/20240721/20115086D37nhO5Se9.png

就可以看到flask服務以gunicron啟動。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言